package com.example.tool.web;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;

import java.util.concurrent.TimeUnit;

import org.lionsoul.ip2region.xdb.Searcher;

@Slf4j
public class IpAddressUtil {

    /**
     * 78，56，43，12，23，6，12，
     *
     *
     *  78，56，43，12，23，6，12，
     *
     *   某商店同时卖出两件商品，售价均为80元。其中A商品的利润率为60%，
     *   B商品的利润率为-0.2。若想要这两件商品整体利润率达到25%，在售价不变的情况下，
     *   仅需A商品的成本（ ）元
     *
     *   60 =-0.2
     *
     *
     *     x = 0.60
     *     6X
     *
     *
     *      -32 +0.2X
     *      .0
     *
     *      160-X =-0.2
     *
     *
     *
     *
     *
     *
     *        =0.60
     *     x
     *
     *
     某单位邀请甲、乙、丙、丁4位嘉宾做演讲，嘉宾甲不第一个出场，嘉宾丁在嘉宾乙后面出场。则一共有（ ）种出场方式。

            乙 甲 丁 丙
            乙 甲 丙 丁
            丙 甲 乙 丁

            乙 丁 甲 丙
            乙 丙 甲 丁

            乙  丁 丙 甲
            丙  乙 丁 甲
            乙  丙 丁 甲
     2022年，全国海洋渔业增加值4343亿元，比上年增长3.1%。全国海水产品产量3459.53万吨，同比增长2.1%。

     2022年，广东省海洋渔业增加值为538亿元，同比增长0.9%。全省海水产品产量458.39万吨，同比增长0.7%，其中，
     海水养殖产量339.67万吨，同比增长1.0%；海洋捕捞产量118.72万吨，其中远洋捕捞产量6.3万吨。

     与2021年相比，2022年广东省海洋渔业增加值占全国渔业增加值的比重约

     538/4348*
                -0.022

     与2018年相比，2022年广东省海洋捕捞产量减少约



     3459.53万吨，同比增长2.1%。
     69.196
     A 6

     B 9

     C 12

     D 15
     *
     *
      */
        // ip2region.xdb 文件地址常量（本地xdb文件路径）
        public static String XDB_PATH = "D:\\IDEA2022.2.3\\workspace\\java\\src\\main\\resources\\ip\\ip2region.xdb";

        /**
         * 完全基于ip2region.xdb文件，对用户ip地址进行转换
         * 注：并发调用时，每个线程需创建一个独立的searcher对象 单独使用。
         */
        public static String getIpPossessionByFile(String ip) {
            if (StringUtils.isNotEmpty(ip)) {
                try {
                    // 1、创建 searcher 对象
                    Searcher searcher = Searcher.newWithFileOnly(XDB_PATH);
                    // 2、查询
                    long sTime = System.nanoTime();
                    String region = searcher.search(ip);
                    long cost = TimeUnit.NANOSECONDS.toMicros(System.nanoTime() - sTime);
                    region = region.replace("|0", "");
                    log.info("{地区: {}, IO操作数: {}, 耗时: {} μs}", region, searcher.getIOCount(), cost);
                    return region;
                } catch (Exception e) {
                    log.error("获取IP地址异常：{} ", e.getMessage());
                    throw new RuntimeException("获取IP地址异常");
                }
            }
            return "未知";
        }

}
